#ifndef __EVENT_SUPPLIER_H_
#define __EVENT_SUPPLIER_H_

#include <COS/CosEventComm.hh>
#include <COS/CosEventChannelAdmin.hh>
#include "event.h"

/**
* Clase wrapper para un emisor de eventos. Para hacer uso
* de esta clase hay que heredar de ella e implementar el metodo
* "disconnect_push_supplier". Las clases que heredan de esta tienen que
* llamar a su constructor.
*
* @author Carlos Rodriguez Dominguez
*/
class EventSupplier : virtual public POA_CosEventComm::PushSupplier {
public:
	
	/**
	* Constructor
	*
	* @param __orb Orbe de CORBA asociado al emisor de eventos
	*/
	EventSupplier(CORBA::ORB_ptr __orb);
	
	/**
	* Destructor
	*/
	virtual ~EventSupplier();
	
	/**
	* Metodo puramente virtual a implementar en las clases que
	* hereden de esta. Este metodo es el que se ejecuta al
	* desconectarse el emisor de eventos
	*/
	virtual void disconnect_push_supplier() = 0;
	
	/**
	* Emite un evento.
	*
	* @param data Evento a emitir
	*/
	virtual void push(GenericObject& data);
	
protected:
	CORBA::ORB_ptr orb; /**< Puntero al orbe asociado al emisor de eventos */
	CosEventChannelAdmin::EventChannel_var channel; /**< Canal de eventos */
	CosEventChannelAdmin::SupplierAdmin_var supplier_admin; /**< Administrador del emisor de eventos */
  	CosEventChannelAdmin::ProxyPushConsumer_var proxy_consumer; /**< Proxy con el consumidor de eventos */

	void disconnect_from_push_consumers();

	/**
	* Crea el emisor de eventos
	*/
	void create_supplier();
};

#endif
